#============================================
# Auth模块
# 其实我们在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表
# django_ session
# auth_ user
# django在启动之后就可以直接访问admin路由，需要输入用户名和密码，数据参考的就是
# auth_ user表,并且还必须是管理员用户才能进入

# 创建超级用户(管理员)
# python3 manage.py createsuperuser
# 依赖于auth_ user表完成用户相关的所有功能
#============================================
# from django.contrib import auth
# auth方法总结
# 1.比对用户 名和密码是否正确
# user_obj = auth.authenticate(request,user_name=username,password=password)
#括号内必须同时传入用户名和密码
# print(user_obj)   用户对象jason      数据不符合则返回None
# print(user_obj.username) # jason 
# print(user_obj.password) #密文

# 2.保存用户状态
# auth.login(request,user_obj)     类似于request. session[key] = user_ obj
#主要执行了该方法你就可以在任何地方通过request.user获取到当前登陆的用户对象

# 3.判断当前用户是否登陆
# request.user.is_authenticated()
 
# 4.获取当前登陆用户
# request.user

# 5.校验用户是否登陆装饰器
# from django.contrib.auth.decorators import login_required
#局部配置
# @login_required(login_url=' /login/')
# #全局配置
# LOGIN_ URL = '/login/'
# 1.如果局部和全局都有该听谁的?
# 局部>全局
# 2.局部和全局哪个好呢?
# 全局的好处在于无需重复写代码但是跳转的页面却很单一
# 局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面

# 6.校验原密码
# request.user.check_password(old_password)

# 7.修改密码
# request.user.set_password(new_password)  #仅仅是在修改对象的属性
# request.user.save() # 这一步才是真正的操作数据库

# 8.注销
# auth.logout(request)

# 9.注册
# from django.contrib.auth.models import User (默认表位置 改了用自己的表路径)
#操作auth_ user表写入数据 b
# User.objects.create(username=username , password=password) # 写入数据不能
# 用create密码没有加密处理 
#创建普通用户
# User.objects.create_user(username=username , password=password)
#创建超级用户(了解) :使用代码创建超级用户邮箱是必填的而用命令创建则可以不填
# User.objects.create_superuser(username=username,email='123@qq. com',password=password)

# 注意用auth模块就用全套 
#============================================
# 如何扩展auth_user表
# from django.db import models
# from django.contrib.auth.models import User , AbstractUser

#第一种:一对一关系
# 不推荐 
# class UserDetail (models .Model):
    # phone = models . BigIntegerField()
    # user = models . OneToOneField(to='User')

#第二种:面向对象的继承
# class UserInfo (AbstractUser) :
    #   phone = models.BigIntegerField() 额外添加字段

# 如果继承了AbstractUser
# 那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了
# 而UserInfo表中会出现auth_ user所有的字段外加自己扩展的字段
# 这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展

# 前提:
# 1.在继承之前没有执行过数据库迁移命令

# auth_user没有被创建，如果当前库已经创建了那么你就重新换一个库
# 2.继承的类里面不要覆盖AbstractUser里面的字段名
# 表里面有的字段都不要动，只扩展额外字段即可

# 3.需要在配置文件中告诉django你要用User Info替代auth_user
# AUTH_USER_MODEL = ' app01.UserInfo ' 即'应用名.表名'

# auth模块还是照常使用,参考的表页由原来的auth_user变成了UserInfo


